﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms
{
    public partial class FrmGestionComprobantes : Form
    {
        DisancoEntities context;
        DataTable dtComprobante;
        DataTable dtComprR;
        DataTable dtComprX;
        DataTable dtComprOC;
        DataTable dtNotasCred;
        public Ventas ComprobanteSelec;
        public VentasAdicionales ComprobanteXSelec;
        public RemitoV ComprobanteRSelec;
        public RemitoVA ComprobanteRVASelec;
        int ComprID;
        bool Continua = true;
        Ventas VentaImprimir;
        string CriterioBusq;
        DateTime fechaDesdeComprobante;
        DateTime fechaHastaComprobante;
        String TipoC;
        const string Nombre = "Nombre Cliente/Proveedor";
        const string Comp = "Nro Comprobante";
        public FrmGestionComprobantes()
        {
            InitializeComponent();

            
            cmbCategorias.Items.Add(Nombre);
            cmbCategorias.Items.Add(Comp);
            cmbCategorias.SelectedIndex = 0;



            btnNotaCredito.Enabled = false;
            bttnVerDetalle.Enabled = false;
            cmbCategorias.SelectedIndex = 0;
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            dtComprobante = new DataTable();
            dtComprobante.Columns.Add("id");
            dtComprobante.Columns.Add("Cliente");
            dtComprobante.Columns.Add("Fecha");
            dtComprobante.Columns.Add("Tipo Comprobante");
            dtComprobante.Columns.Add("Comprobante");
            dtComprobante.Columns.Add("Monto Total");
            dtComprobante.Columns.Add("Estado");
            dtimeFechaDesde.Value = DateTime.Today.AddDays(-30);
        }

      
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            fechaDesdeComprobante = dtimeFechaDesde.Value;
            fechaHastaComprobante = dtimeFechaHasta.Value;
            bool busco = true;
            CriterioBusq = (string)cmbCategorias.SelectedItem;
            if (CriterioBusq == Comp)
            {
                if (txbBuscar.Text == "")
                {
                    MessageBox.Show("Debe Ingresar un Numero de Comprobante");
                    Limpiar();
                    busco = false;
                }
            }
            if (busco == true)
            {
                CargarGrillaCompAB();
                if (radbtnRemito.Checked)
                    CargarGrillaRemito();
                else
                    if (radbtnCompX.Checked)
                        CargarGrillaCompX();
                    else
                        if (radbtnOrdenC.Checked)
                            CargarGrillaOrdenCompra();
                        else
                            if (radbtnNotasCred.Checked)
                                CargarGrillaRemitoX();
                            else
                                if (radbtnNotasCred.Checked)
                                    CargarGrillaNotasCred();

                RediseñarDataGrid();
            }
        }

        private void Limpiar()
        {
            txbBuscar.Text = "";
            bttnVerDetalle.Enabled = false;
        }

        private void CargarGrillaNotasCred()
        {
            dtNotasCred = new DataTable();
            dtNotasCred.Columns.Add("id");
            dtNotasCred.Columns.Add("Cliente");
            dtNotasCred.Columns.Add("Fecha");
            dtNotasCred.Columns.Add("Comprobante");
            dtNotasCred.Columns.Add("Estado");

            TipoC = "NC";
            var ComprNCQuery = from notacred in context.NotasCredito
                              where notacred.Ventas.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                              where  notacred.notacred_fecha>= fechaDesdeComprobante
                              where notacred.notacred_fecha <= fechaHastaComprobante
                              select notacred;

            foreach (var ncred in ComprNCQuery)
            {
                DataRow filaCompr = dtNotasCred.NewRow();
                filaCompr["id"] = ncred.notacred_id;

                filaCompr["Cliente"] = ncred.Ventas.Clientes.cliente_nombre;
                filaCompr["Fecha"] = ncred.notacred_fecha;
                string nrocomp = ncred.notacred_nro.ToString("0000-00000000");
                filaCompr["Comprobante"] = nrocomp;
                filaCompr["Estado"] = ncred.notacred_estado;
                dtComprR.Rows.Add(filaCompr);
            }
            dgvComprobantes.DataSource = dtNotasCred;
            dgvComprobantes.Columns["id"].Visible = false;
        }

        private void CargarGrillaRemitoX()
        {
            
            dtComprR = new DataTable();
            dtComprR.Columns.Add("id");
            dtComprR.Columns.Add("Cliente");
            dtComprR.Columns.Add("Fecha");
            dtComprR.Columns.Add("Comprobante");
            dtComprR.Columns.Add("Estado");

            TipoC = "RX";
            var ComprRQuery = from remito in context.RemitoVA
                              where remito.VentasAdicionales.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                              where remito.fecha >= fechaDesdeComprobante
                              where remito.fecha <= fechaHastaComprobante
                              select remito;

            foreach (var comp in ComprRQuery)
            {
                DataRow filaCompr = dtComprR.NewRow();
                filaCompr["id"] = comp.ra_id;

                filaCompr["Cliente"] = comp.VentasAdicionales.Clientes.cliente_nombre;
                filaCompr["Fecha"] = comp.fecha;
                string nrocompini = comp.numero.ToString("0000-00000000");
                filaCompr["Comprobante"] = nrocompini;
                filaCompr["Estado"] = comp.estado;
                dtComprR.Rows.Add(filaCompr);
            }
            dgvComprobantes.DataSource = dtComprR;
            dgvComprobantes.Columns["id"].Visible = false;
        }

        private void RediseñarDataGrid()
        {
            dgvComprobantes.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvComprobantes.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvComprobantes.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvComprobantes.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvComprobantes.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }

        private void CargarGrillaCompAB()
        {
            dtComprobante.Rows.Clear();

            TimeSpan unDia = new TimeSpan(1, 0, 0, 0);
            fechaDesdeComprobante = dtimeFechaDesde.Value;
            fechaHastaComprobante = dtimeFechaHasta.Value.Date + unDia;

            TipoC = "A";
            
            IEnumerable<Ventas> ComprQuery;
            switch (CriterioBusq)
            {
                case Nombre:
                    ComprQuery = from comprob in context.Ventas
                                 where comprob.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                                 where comprob.venta_fecha >= fechaDesdeComprobante
                                 where comprob.venta_fecha < fechaHastaComprobante
                                 where comprob.venta_tipo_comprobante.Equals(TipoC)
                                 select comprob;
                    break;

                case Comp:
                    long textoin = (long)(Convert.ToInt64(txbBuscar.Text));

                    ComprQuery = from comprob in context.Ventas
                                 where comprob.venta_nro_fin.Equals(textoin)
                                 where comprob.venta_fecha >= fechaDesdeComprobante
                                 where comprob.venta_fecha < fechaHastaComprobante
                                 where comprob.venta_tipo_comprobante.Equals(TipoC)
                                 select comprob;
                    break;
                default:
                    ComprQuery = from comprob in context.Ventas
                                 where comprob.venta_fecha >= fechaDesdeComprobante
                                 where comprob.venta_fecha < fechaHastaComprobante
                                 where comprob.venta_tipo_comprobante.Equals(TipoC)
                                 select comprob;
                    break;

            }
            if (radbtnFactB.Checked)
            {
                TipoC = "B";
                switch (CriterioBusq)
                {
                    case Nombre:
                        ComprQuery = from comprob in context.Ventas
                                     where comprob.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                                     where comprob.venta_fecha >= fechaDesdeComprobante
                                     where comprob.venta_fecha < fechaHastaComprobante
                                     where comprob.venta_tipo_comprobante.Equals(TipoC)
                                     select comprob;
                        break;
                    case Comp:
                        long textoin = (long)(Convert.ToInt64(txbBuscar.Text));

                        ComprQuery = from comprob in context.Ventas
                                     where comprob.venta_nro_inicio.Equals(textoin)
                                     where comprob.venta_fecha >= fechaDesdeComprobante
                                     where comprob.venta_fecha < fechaHastaComprobante
                                     where comprob.venta_tipo_comprobante.Equals(TipoC)
                                     select comprob;
                        break;
                    default:
                        ComprQuery = from comprob in context.Ventas
                                     where comprob.venta_fecha >= fechaDesdeComprobante
                                     where comprob.venta_fecha < fechaHastaComprobante
                                     where comprob.venta_tipo_comprobante.Equals(TipoC)
                                     select comprob;
                        break;
                }
            }
            foreach (var comp in ComprQuery)
            {
                DataRow filaCompr = dtComprobante.NewRow();

                filaCompr["id"] = comp.id_venta;
                filaCompr["Cliente"] = comp.Clientes.cliente_nombre;
                filaCompr["Fecha"] = comp.venta_fecha;
                filaCompr["Tipo Comprobante"] = comp.venta_tipo_comprobante;
                string nrocompini = comp.venta_nro_inicio.ToString("0000-00000000");
                filaCompr["Comprobante"] = nrocompini;
                filaCompr["Monto Total"] = "$ " + Math.Round(Convert.ToDecimal(comp.venta_monto),2);
                filaCompr["Estado"] = comp.venta_estado;
                dtComprobante.Rows.Add(filaCompr);
            }
            dgvComprobantes.DataSource = dtComprobante;
            dgvComprobantes.Columns["id"].Visible = false;
            dgvComprobantes.Sort(dgvComprobantes.Columns["Fecha"], ListSortDirection.Descending);
           
        }

        private void CargarGrillaCompX()
        {
            TipoC = "X";
            IEnumerable<VentasAdicionales> ComprXQuery;
            switch (CriterioBusq)
                {
                    case Nombre:
                                 ComprXQuery = from comprob in context.VentasAdicionales
                                  where comprob.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                                  where comprob.va_fecha >= fechaDesdeComprobante
                                  where comprob.va_fecha <= fechaHastaComprobante
                                  select comprob;
                    break;
                    case Comp:
                    long textoin = (long)(Convert.ToInt64(txbBuscar.Text));

                                 ComprXQuery = from comprob in context.VentasAdicionales
                                               where comprob.va_nro_comp_ini.Equals(textoin)
                                                  where comprob.va_fecha >= fechaDesdeComprobante
                                                  where comprob.va_fecha <= fechaHastaComprobante
                                                  select comprob;
                     break;
                    default:
                     ComprXQuery = from comprob in context.VentasAdicionales
                                   where comprob.va_fecha >= fechaDesdeComprobante
                                   where comprob.va_fecha <= fechaHastaComprobante
                                   select comprob;
                     break;

            }
                dtComprX = new DataTable();
                dtComprX.Columns.Add("id");
                dtComprX.Columns.Add("Cliente");
                dtComprX.Columns.Add("Fecha");
                dtComprX.Columns.Add("Tipo Comprobante");
                dtComprX.Columns.Add("Comprobante");
                dtComprX.Columns.Add("Monto Total");
                dtComprX.Columns.Add("Estado");


                foreach (var comprob in ComprXQuery)
                {
                    DataRow filaComprX = dtComprX.NewRow();
                    filaComprX["id"] = comprob.va_id;
                    filaComprX["Cliente"] = comprob.Clientes.cliente_nombre;
                    filaComprX["Fecha"] = comprob.va_fecha;
                    filaComprX["Tipo Comprobante"] = "X";
                    string nrocompini = comprob.va_nro_comp_ini.ToString("0000-00000000");
                    filaComprX["Comprobante"] = nrocompini;
                    filaComprX["Monto Total"] = "$ " + Math.Round(Convert.ToDecimal(comprob.va_monto), 2);
                    filaComprX["Estado"] = comprob.va_estado;
                    dtComprX.Rows.Add(filaComprX);
                
            } 
            
            dgvComprobantes.DataSource = dtComprX;
            dgvComprobantes.Columns["id"].Visible = false;
            
            
        }

        private void CargarGrillaOrdenCompra()
        {
            
            TipoC = "OC";
            var ComprOCQuery = from comprob in context.OrdenCompra
                               where comprob.Proveedores.prov_nombre.Contains(txbBuscar.Text)
                               where comprob.ord_fecha >= fechaDesdeComprobante
                               where comprob.ord_fecha <= fechaHastaComprobante
                               select comprob;

            dtComprOC = new DataTable();
            dtComprOC.Columns.Add("id");
            dtComprOC.Columns.Add("Proveedor");
            dtComprOC.Columns.Add("Fecha");
            dtComprOC.Columns.Add("Tipo Comprobante");
            dtComprOC.Columns.Add("Comprobante");
            dtComprOC.Columns.Add("Monto Total");
            dtComprOC.Columns.Add("Estado");

            foreach (var comprob in ComprOCQuery)
            {
                DataRow filaComprX = dtComprOC.NewRow();
                filaComprX["id"] = comprob.ord_id;
                filaComprX["Proveedor"] = comprob.Proveedores.prov_nombre;
                filaComprX["Fecha"] = comprob.ord_fecha;
                filaComprX["Tipo Comprobante"] = "Orden de Compra";
                string nrocomp = comprob.ord_numero.ToString("0000-00000000");
                filaComprX["Comprobante"] = nrocomp;
                filaComprX["Monto Total"] = "$ " + Math.Round(comprob.ord_monto,2);
                filaComprX["Estado"] = comprob.ord_estado;
                dtComprOC.Rows.Add(filaComprX);
            }
            dgvComprobantes.DataSource = dtComprOC;
            dgvComprobantes.Columns["id"].Visible = false;
        }

        private void CargarGrillaRemito()
        {
           
            dtComprR = new DataTable();
            dtComprR.Columns.Add("id");
            dtComprR.Columns.Add("Cliente");
            dtComprR.Columns.Add("Fecha");
            dtComprR.Columns.Add("Comprobante");
            dtComprR.Columns.Add("Estado");

            TipoC = "R";
            var ComprRQuery = from remito in context.RemitoV
                              where remito.Ventas.Clientes.cliente_nombre.Contains(txbBuscar.Text)
                              where remito.remito_fecha >= fechaDesdeComprobante
                              where remito.remito_fecha <= fechaHastaComprobante
                              select remito;

            foreach (var comp in ComprRQuery)
            {
                DataRow filaCompr = dtComprR.NewRow();
                filaCompr["id"] = comp.remito_id;
                filaCompr["Cliente"] = comp.Ventas.Clientes.cliente_nombre;
                filaCompr["Fecha"] = comp.remito_fecha;
                string nrocompini = comp.remito_nro_inicio.ToString("0000-00000000");
                filaCompr["Comprobante"] = nrocompini;
                filaCompr["Estado"] = comp.remito_estado;
                dtComprR.Rows.Add(filaCompr);
            }
            dgvComprobantes.DataSource = dtComprR;
            dgvComprobantes.Columns["id"].Visible = false;
            
        }

        private void btnAnular_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Esta Seguro de Anular el Comprobante", "Disanco Sanitarios", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);

            if (result == DialogResult.OK)
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                if (TipoC == "R") //Anular Remito
                {
                    RemitoV RemitAnular = context.RemitoV.FirstOrDefault(comp => comp.remito_id.Equals(ComprobanteRSelec.remito_id));
                    if (RemitAnular.remito_estado == Clases.Estado.Anulada)
                        MessageBox.Show("El Comprobante esta Anulado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    else
                    {
                        if (RemitAnular.Ventas.venta_estado == Clases.Estado.Pendiente)
                        {
                            DialogResult MsjRepregunta = MessageBox.Show("Esta Seguro de Anular el Remito Numero: " + RemitAnular.remito_nro_inicio.ToString("0000-00000000") + " de Fecha: " + RemitAnular.remito_fecha.Date.ToString("dd/MM/yyyy"), "Disanco Sanitarios", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                            if (MsjRepregunta == DialogResult.OK)
                            {
                                RemitAnular.remito_estado = Clases.Estado.Anulada; // Anulo el remito
                                RemitAnular.Ventas.venta_estado = Clases.Estado.Anulada; // Anulo la venta
                                RemitAnular.Ventas.Cuentas.cuenta_estado = Clases.Estado.Anulada; // Anulo la cuenta

                                var LineasQuery = from comprobventa in context.LineaVenta
                                                  where comprobventa.id_venta.Equals(RemitAnular.id_venta)
                                                  select comprobventa;

                                foreach (var lineas in LineasQuery) //incorporar al stock los articulos anulados
                                {
                                    
                                    Articulos Art = context.Articulos.FirstOrDefault(art => art.art_id.Equals(lineas.art_id));
                                    Art.art_stock += lineas.cantidad_venta;
                                }

                                context.SaveChanges();
                                MessageBox.Show("Remito " + RemitAnular.remito_nro_inicio.ToString("0000-00000000") + " Anulado, stock actualizado" , "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                CargarGrillaRemito();
                                RediseñarDataGrid();
                            }
                        }
                        else
                        {
                            MessageBox.Show("El Comprobante no se puede Anular, Existen Facturas Emitidas Relacionadas", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        
                        }
                    }
                }
                else
                    if (TipoC == "X") //Anular Comp X
                    {
                        VentasAdicionales CompAnular = context.VentasAdicionales.FirstOrDefault(comp => comp.va_id.Equals(ComprobanteXSelec.va_id));
                        if (CompAnular.va_estado == Clases.Estado.Anulada)
                        {
                            MessageBox.Show("El Comprobante esta Anulado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Continua = false;
                        }
                        else
                        {
                            if (Continua)
                            {
                                foreach (var cuenta in context.Cuentas)
                                {
                                    if (cuenta.cuenta_id == ComprobanteXSelec.cuenta_id)
                                    {
                                        if (cuenta.cuenta_pagado > 0)
                                        {
                                            MessageBox.Show("El Comprobante no se puede Anular, Existen Pagos Relacionados", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                            Continua = false;
                                            break;
                                        }
                                    }
                                }
                            }

                            if (Continua)
                            {
                                DialogResult MsjRepregunta = MessageBox.Show("Esta Seguro de Anular el Comprobante X Numero: " + CompAnular.va_nro_comp_ini.ToString("0000-00000000") + " de Fecha: " + CompAnular.va_fecha.Date.ToString("dd/MM/yyyy"), "Disanco Sanitarios", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                                if (MsjRepregunta == DialogResult.OK)
                                {
                                    CompAnular.va_estado = Clases.Estado.Anulada;
                                    CompAnular.Cuentas.cuenta_estado = Clases.Estado.Anulada;
                                    CompAnular.va_subtotal = Clases.Constantes.anulado;
                                    CompAnular.va_iva = Clases.Constantes.anulado;
                                   
                                    var LineasQuery = from comprob in context.LineaVentaAdicional
                                                      where comprob.va_id.Equals(ComprID)
                                                      select comprob;

                                    foreach (var lineas in LineasQuery) //incorporar al stock los articulos anulados
                                    {
                                        Articulos Art = context.Articulos.FirstOrDefault(art => art.art_id.Equals(lineas.art_id));
                                        Art.art_stock += lineas.linva_cant;
                                    }

                                    context.SaveChanges();
                                    MessageBox.Show("Comprobante " + CompAnular.va_nro_comp_ini.ToString("0000-00000000") + " Anulado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                    CargarGrillaCompX();
                                    RediseñarDataGrid();
                                }
                            }
                        }
                    }
                    else
                        if (TipoC == "A" | TipoC == "B")
                        {
                            Continua = true;

                            Ventas ComprobanteAnular = context.Ventas.FirstOrDefault(comp => comp.id_venta.Equals(ComprobanteSelec.id_venta));

                            if (ComprobanteAnular.venta_estado == Clases.Estado.Anulada)
                            {
                                MessageBox.Show("Imposible Anular Comprobante, el mismo fue Anulado Anteriormente", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Continua = false;
                            }
                            else
                            {

                                //foreach (var rem in context.RemitoV)
                                //{
                                //    if (rem.id_venta == ComprobanteSelec.id_venta)
                                //    {
                                //        if (rem.remito_estado == Clases.Estado.Emitida)
                                //        {
                                //            MessageBox.Show("El Comprobante no se puede Anular, Existen Remitos Generados", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                //            Continua = false;
                                //            break;
                                //        }
                                //    }
                                //}

                                if (Continua)
                                {
                                    foreach (var cuenta in context.Cuentas)
                                    {
                                        if (cuenta.cuenta_id == ComprobanteSelec.cuenta_id)
                                        {
                                            if (cuenta.cuenta_pagado > 0)
                                            {
                                                MessageBox.Show("El Comprobante no se puede Anular, Existen Pagos Relacionados", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                                Continua = false;
                                                break;
                                            }
                                        }

                                    }
                                }

                                if (Continua)
                                {
                                    DialogResult MsjRepregunta = MessageBox.Show("Esta Seguro de Anular el Comprobante Numero: " + TipoC + ComprobanteAnular.venta_nro_inicio.ToString(" 0000-00000000") + " de Fecha: " + ComprobanteAnular.venta_fecha.Date.ToString("dd/MM/yyyy"), "Disanco Sanitarios", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                                    if (MsjRepregunta == DialogResult.OK)
                                    {
                                        ComprobanteAnular.venta_estado = Clases.Estado.Anulada;
                                        ComprobanteAnular.Cuentas.cuenta_estado = Clases.Estado.Anulada;
                                        ComprobanteAnular.venta_subtotal = Clases.Constantes.anulado;
                                        ComprobanteAnular.venta_iva = Clases.Constantes.anulado;

                                        var LineasQuery = from comprob in context.LineaVenta
                                                          where comprob.id_venta.Equals(ComprID)
                                                          select comprob;

                                        foreach (var lineas in LineasQuery)
                                        {
                                            Articulos Art = context.Articulos.FirstOrDefault(art => art.art_id.Equals(lineas.art_id));
                                            Art.art_stock += Convert.ToInt32(lineas.cantidad_venta);
                                        }
                                        context.SaveChanges();
                                        MessageBox.Show("Comprobante " + ComprobanteAnular.venta_nro_inicio.ToString("0000-00000000") + " Anulado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                        CargarGrillaCompAB();
                                        RediseñarDataGrid();
                                    }
                                }
                            }
                            }
                        else
                            if (TipoC == "OC")
                            {
                              
                            
                            }
                        }
            
        }

        private void dgvComprobantes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
           
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            ComprID = Convert.ToInt32(dgvComprobantes[0, dgvComprobantes.CurrentRow.Index].Value.ToString());


            if (TipoC == "X")
            {
                this.ComprobanteXSelec = context.VentasAdicionales.FirstOrDefault(compx => compx.va_id.Equals(ComprID));
                bttnVerDetalle.Enabled = true;
                btnNotaCredito.Enabled = true;
             }
            else
                if (TipoC == "A")
                {
                    this.ComprobanteSelec = context.Ventas.FirstOrDefault(comp => comp.id_venta.Equals(ComprID));
                    bttnVerDetalle.Enabled = true;
                    btnNotaCredito.Enabled = true;
                 }
                else
                    if (TipoC == "B")
                    {
                        this.ComprobanteSelec = context.Ventas.FirstOrDefault(comp => comp.id_venta.Equals(ComprID));
                        bttnVerDetalle.Enabled = true;
                        btnNotaCredito.Enabled = true;
                     }
                    else
                        if (TipoC == "R")
                        {
                            this.ComprobanteRSelec = context.RemitoV.FirstOrDefault(comp => comp.remito_id.Equals(ComprID));
                            bttnVerDetalle.Enabled = false;
                            btnNotaCredito.Enabled = true;
                        }
                        else
                            if (TipoC == "RX")
                            {
                                this.ComprobanteRVASelec = context.RemitoVA.FirstOrDefault(comp => comp.ra_id.Equals(ComprID));
                                bttnVerDetalle.Enabled = false;
                                btnNotaCredito.Enabled = true;
                            }


            //else
            //    if (TipoC == "OC")
            //this.ComprobanteSelec = context.OrdenCompra.FirstOrDefault(comp => comp.ord_id.Equals(ComprID));
        }

        private void FrmGestionComprobantes_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.Handled = true;
                btnBuscar_Click(sender, e);
            }

        }

        private void bttnVerDetalle_Click(object sender, EventArgs e)
        {
            if (TipoC == "A" | TipoC == "B")
            {
                GestionClientes.frmDetalleCompra detalle = new GestionClientes.frmDetalleCompra(this.ComprobanteSelec);
                detalle.ShowDialog();
                bttnVerDetalle.Enabled = false;
            }
            else
            if (TipoC == "X")            
                {
                GestionClientes.frmDetalleCompraAd detalle = new GestionClientes.frmDetalleCompraAd(this.ComprobanteXSelec);
                detalle.ShowDialog();
                bttnVerDetalle.Enabled = false;
                }
         }

        private void FrmGestionComprobantes_Load(object sender, EventArgs e)
        {
            txbBuscar.Focus();
            radbtnFactA.Checked = true;
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            Limpiar();
        }

        private void bttnFacturar_Click(object sender, EventArgs e)
        {
            //var venta = context.Ventas.FirstOrDefault(vta => vta.id_venta.Equals(ComprobanteRSelec.id_venta));
            //frmEmitirFactura.ventaid = venta.id_venta;

            ////frmEmitirFactura facturar = new frmEmitirFactura();
            ////facturar.ShowDialog();

        }

        private void btnRegenerar_Click(object sender, EventArgs e)
        {
            if (radbtnFactA.Checked | radbtnFactB.Checked)
            {
                DialogResult dr = MessageBox.Show("Esta seguro de Anular el Comprobante y Generar una copia nueva?", "Disanco Sanitarios", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr == System.Windows.Forms.DialogResult.Yes)
                {
                    if (dgvComprobantes.CurrentRow != null)
                    {
                        regenerarAB();
                    }
                }
            }
        }

        private void regenerarAB()
        {
            context = new DisancoEntities();
            try
            {
                if (dgvComprobantes.CurrentRow.Cells["Estado"].Value.ToString() != Estado.Anulada)
                {
                    //Genero nueva factura anulada
                    int idVenta = Convert.ToInt32(dgvComprobantes.CurrentRow.Cells["id"].Value);

                    Ventas ventaSeleccionada = context.Ventas.FirstOrDefault(v => v.id_venta == idVenta);

                    int autId = Funcion.obtenerAuth(ventaSeleccionada.venta_tipo_comprobante);
                    if (autId != 0)
                    {
                        Ventas ventaAnulada = new Ventas();

                        ventaAnulada.Clientes = ventaSeleccionada.Clientes;
                        ventaAnulada.venta_estado = Estado.Anulada;
                        ventaAnulada.venta_tipo_comprobante = ventaSeleccionada.venta_tipo_comprobante;
                        ventaAnulada.venta_nro_inicio = ventaSeleccionada.venta_nro_inicio;
                        ventaAnulada.venta_nro_fin = ventaSeleccionada.venta_nro_inicio;
                        ventaAnulada.venta_fecha = ventaSeleccionada.venta_fecha;
                        ventaAnulada.venta_subtotal = ventaSeleccionada.venta_subtotal;
                        ventaAnulada.venta_iva = ventaSeleccionada.venta_iva;
                        ventaAnulada.venta_descuento = ventaSeleccionada.venta_descuento;
                        
                        context.AddToVentas(ventaAnulada);

                        //Actualizo la anterior
                        long nrofacturaviejo = ventaSeleccionada.venta_nro_inicio;
                        DateTime fechafactvieja = ventaSeleccionada.venta_fecha;


                        Autorizaciones auth = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id == autId);
                        auth.autorizacion_ultimo_numero = auth.autorizacion_ultimo_numero + 1;

                        ventaSeleccionada.venta_nro_inicio = auth.autorizacion_ultimo_numero;
                        ventaSeleccionada.venta_nro_fin = auth.autorizacion_ultimo_numero; // anda bienn??
                        //ventaSeleccionada.venta_nro_fin = ventaSeleccionada.venta_nro_inicio;
                        ventaSeleccionada.venta_fecha = DateTime.Now;
                        context.SaveChanges(); // aca da error???
                       
                        MessageBox.Show("Factura Generada Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                     
                        DialogResult dr = MessageBox.Show("Imprimir la factura?", "Imprimir", MessageBoxButtons.OK, MessageBoxIcon.Question);

                        if (dr == System.Windows.Forms.DialogResult.OK)
                        {
                            ImprimirComprobanteAB(ventaSeleccionada);
                            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
                            CargarGrillaCompAB();
                        }
                    }
                }
                else
                {
                    MessageBox.Show("No se puede regenerar una factura anulada","Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

        public void ImprimirComprobanteAB(Ventas VentaImp)
        {
            VentaImprimir = VentaImp;

            printDialogAB.PrinterSettings.Copies = 3;
           
            DialogResult resultadounico = printDialogAB.ShowDialog();

            if (resultadounico == DialogResult.OK)
            {
                 printDocAB.PrinterSettings = printDialogAB.PrinterSettings;
                printPreviewDiAB.Document = printDocAB;
                ((Form)printPreviewDiAB).WindowState = FormWindowState.Maximized;
                printPreviewDiAB.ShowDialog();
            }
         }

        private void printDocAB_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            DisancoEntities context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            Font miniprintFont = new Font("Calibri", 7);
            Font printFont = new Font("Calibri", 8);
            Font printFontTit = new Font("Calibri", 12);
            Font printFontTotal = new Font("Calibri", 13);

            int margenX = 35;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            string factnumero = VentaImprimir.venta_nro_inicio.ToString();
            string fecha = VentaImprimir.venta_fecha.Date.ToString("dd/MM/yyyy");

            e.Graphics.DrawString((factnumero.Substring(1, 8)), miniprintFont, Brushes.Black, 585, 63);
            e.Graphics.DrawString("Fecha:", printFontTit, Brushes.Black, 500, 75);
            e.Graphics.DrawString(fecha, printFontTit, Brushes.Black, 570, 75);
            
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_nombre, printFont, Brushes.Black, 130, 186);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_direccion, printFont, Brushes.Black, 130, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_localidad, printFont, Brushes.Black, 450, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.CondicionIVA.condicion_sigla, printFont, Brushes.Black, 130, 216);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_cuit, printFont, Brushes.Black, 450, 216);
            

            e.Graphics.DrawString("Cliente:", printFont, Brushes.Black, 90, 186, formato);
            e.Graphics.DrawString("Dirección:", printFont, Brushes.Black, 80, 201, formato);
            e.Graphics.DrawString("Localidad:", printFont, Brushes.Black, 400, 201, formato);
            e.Graphics.DrawString("Cond. IVA:", printFont, Brushes.Black, 80, 216, formato);
            e.Graphics.DrawString("CUIT:", printFont, Brushes.Black, 415, 216, formato);

            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, miniprintFont, Brushes.Black, 32, 255);
            String Cod = "Codigo Art.";
            e.Graphics.DrawString(Cod, miniprintFont, Brushes.Black, 87, 255);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, miniprintFont, Brushes.Black, 323, 255);
            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, miniprintFont, Brushes.Black, 590, 255);
            String Bonif = "Bonif.";
            e.Graphics.DrawString(Bonif, miniprintFont, Brushes.Black, 645, 255);
            String PrecioOf = "Precio Bonif";
            e.Graphics.DrawString(PrecioOf, miniprintFont, Brushes.Black, 701, 255);
            String Importe = "Total";
            e.Graphics.DrawString(Importe, miniprintFont, Brushes.Black, 771, 255);

            //Proceso de dibujado de las lineas de factura
            int posY = 275;
            int anchoLinea = 20;
            int posCantidad = margenX + 15;
            int posCod = posCantidad + 42;
            int posArticulo = posCod + 60;
            int posPrecioU = posArticulo + 436;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 54;
            int posPrecioT = posPrecioOf + 65;

            foreach (var linea in VentaImprimir.LineaVenta)
            {
                e.Graphics.DrawString(linea.cantidad_venta.ToString(), printFont, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(linea.Articulos.art_codigo.ToString(), printFont, Brushes.Black, posCod, posY);
                e.Graphics.DrawString(linea.Articulos.art_nombre.ToString(), printFont, Brushes.Black, posArticulo, posY);
                e.Graphics.DrawString(linea.precio_venta.ToString(), printFont, Brushes.Black, posPrecioU, posY);
                decimal bon = (Convert.ToDecimal(linea.oferta_bonif.ToString()));
                if (bon > 0)
                {
                    string nuevobon = bon.ToString("0.00 %");
                    e.Graphics.DrawString(nuevobon, miniprintFont, Brushes.Black, posBonif, posY);
                }
                e.Graphics.DrawString(linea.precio_bonif.ToString(), printFont, Brushes.Black, posPrecioOf, posY);
                e.Graphics.DrawString(linea.precio_final.ToString(), printFont, Brushes.Black, posPrecioT, posY);

                posY += anchoLinea;
            }

            int lineafin = 995;
            int posSubtotX = 70;
            decimal total = Math.Round((Convert.ToDecimal(VentaImprimir.venta_monto)), 2);

            if (VentaImprimir.venta_tipo_comprobante == "A")
            {
                String subtot = "SUB-TOTAL $";
                e.Graphics.DrawString(subtot, printFontTit, Brushes.Black, posSubtotX, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_subtotal), printFontTit, Brushes.Black, posSubtotX + 118, lineafin);

                decimal descuento = Math.Round(Convert.ToDecimal((VentaImprimir.venta_subtotal) - (VentaImprimir.venta_monto - VentaImprimir.venta_iva)), 2);
                String desc = "Descuento $";
                e.Graphics.DrawString(desc, printFontTit, Brushes.Black, posSubtotX + 220, lineafin);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 310, lineafin + 4);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontTit, Brushes.Black, posSubtotX + 350, lineafin);

                String iva = "IVA $";
                e.Graphics.DrawString(iva, printFontTit, Brushes.Black, posSubtotX + 425, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_iva), printFontTit, Brushes.Black, posSubtotX + 475, lineafin);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 570, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 666, lineafin);
            }
            else
            {
                String subtot = "SUB-TOTAL $";
                e.Graphics.DrawString(subtot, printFontTit, Brushes.Black, posSubtotX + 178, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_subtotal), printFontTit, Brushes.Black, posSubtotX + 278, lineafin);

                decimal descuento = Math.Round(Convert.ToDecimal(VentaImprimir.venta_subtotal - VentaImprimir.venta_monto), 2);
                String desc = "Descuento $";
                e.Graphics.DrawString(desc, printFontTit, Brushes.Black, posSubtotX + 370, lineafin);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontTit, Brushes.Black, posSubtotX + 505, lineafin);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 465, lineafin + 4);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 570, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 666, lineafin);
            }
        }

        private void btnNotaCredito_Click(object sender, EventArgs e)
        {
            if (TipoC == "A" | TipoC == "B")
            {
                Ventas Comprobante = context.Ventas.FirstOrDefault(comp => comp.id_venta.Equals(ComprobanteSelec.id_venta));
                Forms.GestionPedidos.FrmIncrementoNC IncrementoNC = new GestionPedidos.FrmIncrementoNC(Comprobante.id_venta, Comprobante.cliente_id, TipoC);
                IncrementoNC.ShowDialog();
                //GestionPedidos.FrmNotaCredito ncredito = new GestionPedidos.FrmNotaCredito(Comprobante.id_venta,Comprobante.cliente_id,TipoC);
                //ncredito.ShowDialog();
            }
            else
                if (TipoC == "X")
                {
                    VentasAdicionales CompAnular = context.VentasAdicionales.FirstOrDefault(comp => comp.va_id.Equals(ComprobanteXSelec.va_id));
                    Forms.GestionPedidos.FrmIncrementoNC IncrementoNC = new GestionPedidos.FrmIncrementoNC(CompAnular.va_id, CompAnular.cliente_id, TipoC);
                    IncrementoNC.ShowDialog();
                   
                    //GestionPedidos.FrmNotaCredito ncredito = new GestionPedidos.FrmNotaCredito(CompAnular.va_id,CompAnular.cliente_id,TipoC);
                    //ncredito.ShowDialog();
                }
        }

        private void cmbCategorias_SelectedIndexChanged(object sender, EventArgs e)
        {
            txbBuscar.Enabled = true;
        }

        private void txbBuscar_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (cmbCategorias.SelectedItem.Equals(Comp))
            {
                Validar.ValidarNumeros(e);
             } 
        }
    }
}
